﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Datos.Fabricas;
using Datos.Interfaces;
using Datos.Entidades;
using Datos.Entidades.FabricaEntidades;
using log4net;


namespace Datos.DAOSqlServer
{

    /// <summary>
    /// Clase DAO que permite el Acceso a los metodos de las apuestas
    /// </summary>
    public class DAOSqlAccesoApuesta : IDAOAccesoApuesta
    {
        IDAOAccesoConexion bd = FabricaConexion.DAOSqlServerAccesoConexion();

        #region Logger
        private static readonly ILog log = LogManager.GetLogger(
        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);





        #endregion
        public DAOSqlAccesoApuesta()
        {

        }


        /// <summary>
        /// Busca los participantes que pertenecen a un evento para apostar
        /// </summary>
        /// <param name="usuario">Participante a buscar</param>
        public List<Entidad> BuscarParticipanteApuesta(int id)
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaevento = new List<Entidad>();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[BUSParticipanteID4]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Id", (id));

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Entidad eventoss = FabricaEntidades.ObtenerEvento();

                    (eventoss as Evento).Id_HistorialParticipante = reader.GetInt32(0);

                    (eventoss as Evento).NombreParticipante = reader["Nombre"].ToString();
                    (eventoss as Evento).TopeApuesta = reader.GetInt32(2);
                    (eventoss as Evento).RelacionPago = reader.GetInt32(3);

                    listaevento.Add(eventoss as Evento);
                }
                reader.Close();
                bd.CerrarConexionBd();
                log.Info("Se genero la consulta");
                return listaevento;
            }
            catch (SqlException)
            {
                log.Error("No se genero la consulta");
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return null;
            }
        }
        /// <summary>
        /// Buscar apuestas sin trasmitir
        /// </summary>
        /// <returns>lista de apuestas</returns>
        public List<Entidad> BuscarApuestas()
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[Apuestas]";
                command.CommandTimeout = 10;
                SqlDataReader reader = command.ExecuteReader();
                List<Entidad> ListaApuestas = new List<Entidad>();

                while (reader.Read())
                {
                    Entidad accesos = FabricaEntidades.ObtenerAccesos();
                    (accesos as Acceso).IdAcceso = (reader.GetInt32(0));
                    (accesos as Acceso).Fecha = (reader["fecha"].ToString());
                    (accesos as Acceso).Hora = (reader.GetInt32(2));
                    (accesos as Acceso).Min = (reader.GetInt32(3));
                    (accesos as Acceso).MontoApostado = (reader.GetInt64(4));
                    (accesos as Acceso).FkIdEvento = (reader.GetInt32(5));
                    (accesos as Acceso).FkIdHistorialParticipante = (reader.GetInt32(6));
                    (accesos as Acceso).Exportado = (reader.GetInt32(7));
                    (accesos as Acceso).FkIdMaquina = (reader.GetInt32(8));
                                    ListaApuestas.Add(accesos);
                } log.Info("Se genero la consulta");
                reader.Close();
                bd.CerrarConexionBd();
                return ListaApuestas;

            }
            catch (SqlException)
            {
                log.Error("no se genero la consulta");
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");

                bd.CerrarConexionBd();
                return null;
            }
        }


        /// <summary>
        /// Inserta una nueva apuesta de eventos en la base de datos
        /// </summary>
        /// <param name="usuario">Apuesta en Acceso a insertar</param>
        /// <returns>Si la creación fue exitosa o no</returns>

        public bool InsertarAccesoApuesta(Entidad evento)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[INSAccesoApuesta]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@MontoApostado", (evento as Evento).Monto);
                command.Parameters.AddWithValue("@Pronostico", (evento as Evento).Puntos);
                command.Parameters.AddWithValue("@FK_Id_Maquina", (evento as Evento).FK_Id_Maquina);
                command.Parameters.AddWithValue("@FK_Id_Evento", (evento as Evento).FK_Id_Evento);
                command.Parameters.AddWithValue("@FK_Id_HistorialParticipante", (evento as Evento).Id_HistorialParticipante);
               




                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();
                log.Info("Se genero la consulta");
                return true;
            }
            catch (SqlException)
            {
                log.Error("Error en la consulta");
                bd.CerrarConexionBd();
                return false;
            }
            catch (Exception)
            {

                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return false;
            }
        }


        /// <summary>
        /// Muestra el id de la maquina q se encuentra
        /// </summary>
        /// <param name="usuario">Maquina a mostrar</param>
        /// <returns>Si la creación fue exitosa o no</returns>

        public List<Entidad> ObtenerTodasMaquinas()
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELTodasMaquina]";
                command.CommandTimeout = 10;

                List<Entidad> listaMaquina = new List<Entidad>();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Entidad maquina = FabricaEntidades.ObtenerMaquina();
                    (maquina as Maquina).IdMaquina = (reader.GetInt32(0));
                    listaMaquina.Add((maquina as Maquina));
                }

                reader.Close();
                bd.CerrarConexionBd();
                log.Info("Se ejecuto la consulta");
                return listaMaquina;
            }
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                log.Error("Error en la consulta");
                return null;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return null;
            }
        }



    }
}
